
package jdx_09_锁的细化;

import java.util.concurrent.TimeUnit;

/**
 * synchronized优化
 * 同步代码块中的语句越少越好
 * 比较m1和m2
 *
 */


//对于锁的细化
public class FineCoarseLock {

	int count = 0;

	synchronized void m1() {
		//业务代码_1 (用沉睡模拟)
		try {
			TimeUnit.SECONDS.sleep(2);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//业务逻辑中只有下面这句需要sync，这时不应该给整个方法上锁
		count ++;

		//业务代码_2 (用沉睡模拟)
		try {
			TimeUnit.SECONDS.sleep(2);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	void m2() {
		//do sth need not sync
		try {
			TimeUnit.SECONDS.sleep(2);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//业务逻辑中只有下面这句需要sync，这时不应该给整个方法上锁
		//采用细粒度的锁，可以使线程争用时间变短，从而提高效率
		synchronized(this) {
			count ++;
		}
		//do sth need not sync
		try {
			TimeUnit.SECONDS.sleep(2);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}



}

/*

这是有关于锁的细化，那么存在锁的粗化吗？

存在！当我们一个方法中，很多地方都需要加锁的时候，这些细碎的锁反而会导致效率降低，此时我还不如直接给方法加个锁。






 */
